*
* @param string $virtualUrl
* @param array $headers Additional HTTP headers to send on success
- * @return bool Success
+ * @return Status
+ * @since 1.27
*/
- public function streamFile( $virtualUrl, $headers = array() ) {
+ public function streamFileWithStatus( $virtualUrl, $headers = array() ) {
$path = $this->resolveToStoragePath( $virtualUrl );
$params = array( 'src' => $path, 'headers' => $headers );
- return $this->backend->streamFile( $params )->isOK();
+ return $this->backend->streamFile( $params );
+ }
+
+ /**
+ * Attempt to stream a file with the given virtual URL/storage path
+ *
+ * @deprecated since 1.26, use streamFileWithStatus
+ * @param string $virtualUrl
+ * @param array $headers Additional HTTP headers to send on success
+ * @return bool Success
+ */
+ public function streamFile( $virtualUrl, $headers = array() ) {
+ return $this->streamFileWithStatus( $virtualUrl, $headers )->isOK();
}
/**
* Stream the file if there were no errors
*
* @param array $headers Additional HTTP headers to send on success
- * @return bool Success
+ * @return Status
+ * @since 1.27
*/
- public function streamFile( $headers = array() ) {
+ public function streamFileWithStatus( $headers = array() ) {
if ( !$this->path ) {
- return false;
+ return Status::newFatal( 'backend-fail-stream', '<no path>' );
} elseif ( FileBackend::isStoragePath( $this->path ) ) {
$be = $this->file->getRepo()->getBackend();
-
- return $be->streamFile( array( 'src' => $this->path, 'headers' => $headers ) )->isOK();
+ return $be->streamFile( array( 'src' => $this->path, 'headers' => $headers ) );
} else { // FS-file
- return StreamFile::stream( $this->getLocalCopyPath(), $headers );
+ $success = StreamFile::stream( $this->getLocalCopyPath(), $headers );
+ return $success ? Status::newGood() : Status::newFatal( 'backend-fail-stream', $this->path );
}
}
+ /**
+ * Stream the file if there were no errors
+ *
+ * @deprecated since 1.26, use streamFileWithStatus
+ * @param array $headers Additional HTTP headers to send on success
+ * @return bool Success
+ */
+ public function streamFile( $headers = array() ) {
+ $this->streamFileWithStatus( $headers )->isOK();
+ }
+
/**
* Wrap some XHTML text in an anchor tag with the given attributes
*
* @ingroup Media
*/
+use MediaWiki\Logger\LoggerFactory;
+
define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
require __DIR__ . '/includes/WebStart.php';
);
return;
} catch ( MWException $e ) {
- wfThumbError( 500, $e->getHTML() );
+ wfThumbError( 500, $e->getHTML(), 'Exception caught while extracting thumb name',
+ array( 'exception' => $e ) );
return;
}
$thumbPath = $img->getThumbPath( $thumbName );
if ( $img->getRepo()->fileExists( $thumbPath ) ) {
$starttime = microtime( true );
- $success = $img->getRepo()->streamFile( $thumbPath, $headers );
+ $status = $img->getRepo()->streamFileWithStatus( $thumbPath, $headers );
$streamtime = microtime( true ) - $starttime;
- if ( !$success ) {
- wfThumbError( 500, 'Could not stream the file' );
- } else {
+ if ( $status->isOK() ) {
RequestContext::getMain()->getStats()->timing( 'media.thumbnail.stream', $streamtime );
+ } else {
+ wfThumbError( 500, 'Could not stream the file', null, array( 'file' => $thumbName,
+ 'path' => $thumbPath, 'error' => $status->getWikiText() ) );
}
return;
}
}
if ( $errorMsg !== false ) {
- wfThumbError( $errorCode, $errorMsg );
+ wfThumbError( $errorCode, $errorMsg, null, array( 'file' => $thumbName, 'path' => $thumbPath ) );
} else {
// Stream the file if there were no errors
- $success = $thumb->streamFile( $headers );
- if ( !$success ) {
- wfThumbError( 500, 'Could not stream the file' );
+ $status = $thumb->streamFileWithStatus( $headers );
+ if ( !$status->isOK() ) {
+ wfThumbError( 500, 'Could not stream the file', null, array(
+ 'file' => $thumbName, 'path' => $thumbPath, 'error' => $status->getWikiText() ) );
}
}
}
*
* @param int $status
* @param string $msgHtml HTML
+ * @param string $msgText Short error description, for internal logging. Defaults to $msgHtml.
+ * Only used for HTTP 500 errors.
+ * @param array $context Error context, for internal logging. Only used for HTTP 500 errors.
* @return void
*/
-function wfThumbError( $status, $msgHtml ) {
+function wfThumbError( $status, $msgHtml, $msgText = null, $context = array() ) {
global $wgShowHostnames;
header( 'Cache-Control: no-cache' );
HttpStatus::header( 403 );
header( 'Vary: Cookie' );
} else {
+ LoggerFactory::getInstance( 'thumb' )->error( $msgText ?: $msgHtml, $context );
HttpStatus::header( 500 );
}
if ( $wgShowHostnames ) {